<?php
// +----------------------------------------------------------------------
// | ThinkCMF [ WE CAN DO IT MORE SIMPLE ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013-2017 http://www.thinkcmf.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 老猫 <thinkcmf@126.com>
// +----------------------------------------------------------------------
namespace app\portal\model;

use app\admin\model\RouteModel;
use think\Db;
use think\Model;

class PortalPostModel extends Model {

	protected $type = [
		'more' => 'array',
	];

	// 开启自动写入时间戳字段
	protected $autoWriteTimestamp = true;

	/**
	 * 关联 user表
	 * @return $this
	 */
	public function user() {
		return $this->belongsTo('UserModel', 'user_id')->setEagerlyType(1);
	}

	/**
	 * 关联分类表
	 */
	public function categories() {
		return $this->belongsToMany('PortalCategoryModel', 'portal_category_post', 'category_id', 'post_id');
	}

	/**
	 * post_content 自动转化
	 * @param $value
	 * @return string
	 */
	public function getPostContentAttr($value) {
		return cmf_replace_content_file_url(htmlspecialchars_decode($value));
	}

	/**
	 * post_content 自动转化
	 * @param $value
	 * @return string
	 */
	public function setPostContentAttr($value) {
		return htmlspecialchars(cmf_replace_content_file_url(htmlspecialchars_decode($value), true));
	}

	/**
	 * published_time 自动完成
	 * @param $value
	 * @return false|int
	 */
	public function setPublishedTimeAttr($value) {
		return strtotime($value);
	}

	/**
	 * 后台管理添加文章
	 * @param array $data 文章数据
	 * @param array|string $categories 文章分类 id
	 * @return $this
	 */
	public function adminAddArticle($data, $categories) {

		if (empty($data['user_id'])) {
			//如果是后台用户添加文章
			$data['user_id'] = cmf_get_current_admin_id();
		}

		$data['user_id'] = empty($data['user_id']) ? 0 : $data['user_id'];

		if (!empty($data['more']['thumbnail'])) {
			$data['more']['thumbnail'] = cmf_asset_relative_url($data['more']['thumbnail']);
		}

		$this->allowField(true)->data($data, true)->isUpdate(false)->save();

		if (is_string($categories)) {
			$categories = explode(',', $categories);
		}

		$this->categories()->save($categories);

		$data['post_keywords'] = str_replace('，', ',', $data['post_keywords']);

		$keywords = explode(',', $data['post_keywords']);

		$this->addTags($keywords, $this->id);

		return $this;

	}

	/**
	 * 后台管理编辑文章
	 * @param array $data 文章数据
	 * @param array|string $categories 文章分类 id
	 * @return $this
	 */
	public function adminEditArticle($data, $categories) {

		unset($data['user_id']);

		if (!empty($data['more']['thumbnail'])) {
			$data['more']['thumbnail'] = cmf_asset_relative_url($data['more']['thumbnail']);
		}

		$data['post_status'] = empty($data['post_status']) ? 0 : 1;
		$data['is_top'] = empty($data['is_top']) ? 0 : 1;
		$data['recommended'] = empty($data['recommended']) ? 0 : 1;

		$this->allowField(true)->isUpdate(true)->data($data, true)->save();

		if (is_string($categories)) {
			$categories = explode(',', $categories);
		}

		$oldCategoryIds = $this->categories()->column('category_id');
		$sameCategoryIds = array_intersect($categories, $oldCategoryIds);
		$needDeleteCategoryIds = array_diff($oldCategoryIds, $sameCategoryIds);
		$newCategoryIds = array_diff($categories, $sameCategoryIds);

		if (!empty($needDeleteCategoryIds)) {
			$this->categories()->detach($needDeleteCategoryIds);
		}

		if (!empty($newCategoryIds)) {
			$this->categories()->attach(array_values($newCategoryIds));
		}

		$data['post_keywords'] = str_replace('，', ',', $data['post_keywords']);

		$keywords = explode(',', $data['post_keywords']);

		$this->addTags($keywords, $data['id']);

		return $this;

	}

	public function addTags($keywords, $articleId) {
		$portalTagModel = new PortalTagModel();

		$tagIds = [];

		$data = [];

		if (!empty($keywords)) {

			$oldTagIds = Db::name('portal_tag_post')->where('post_id', $articleId)->column('tag_id');

			foreach ($keywords as $keyword) {
				$keyword = trim($keyword);
				if (!empty($keyword)) {
					$findTag = $portalTagModel->where('name', $keyword)->find();
					if (empty($findTag)) {
						$tagId = $portalTagModel->insertGetId([
							'name' => $keyword,
						]);
					} else {
						$tagId = $findTag['id'];
					}

					if (!in_array($tagId, $oldTagIds)) {
						array_push($data, ['tag_id' => $tagId, 'post_id' => $articleId]);
					}

					array_push($tagIds, $tagId);

				}
			}

			if (empty($tagIds) && !empty($oldTagIds)) {
				Db::name('portal_tag_post')->where('post_id', $articleId)->delete();
			}

			$sameTagIds = array_intersect($oldTagIds, $tagIds);

			$shouldDeleteTagIds = array_diff($oldTagIds, $sameTagIds);

			if (!empty($shouldDeleteTagIds)) {
				Db::name('portal_tag_post')->where(['post_id' => $articleId, 'tag_id' => ['in', $shouldDeleteTagIds]])->delete();
			}

			if (!empty($data)) {
				Db::name('portal_tag_post')->insertAll($data);
			}

		} else {
			Db::name('portal_tag_post')->where('post_id', $articleId)->delete();
		}
	}

	public function adminDeletePage($data) {

		if (isset($data['id'])) {
			$id = $data['id']; //获取删除id

			$res = $this->where(['id' => $id])->find();

			if ($res) {
				$res = json_decode(json_encode($res), true); //转换为数组

				$recycleData = [
					'object_id' => $res['id'],
					'create_time' => time(),
					'table_name' => 'portal_post#page',
					'name' => $res['post_title'],

				];

				Db::startTrans(); //开启事务
				$transStatus = false;
				try {
					Db::name('portal_post')->where(['id' => $id])->update([
						'delete_time' => time(),
					]);
					Db::name('recycle_bin')->insert($recycleData);

					$transStatus = true;
					// 提交事务
					Db::commit();
				} catch (\Exception $e) {

					// 回滚事务
					Db::rollback();
				}
				return $transStatus;

			} else {
				return false;
			}
		} elseif (isset($data['ids'])) {
			$ids = $data['ids'];

			$res = $this->where(['id' => ['in', $ids]])
				->select();

			if ($res) {
				$res = json_decode(json_encode($res), true);
				foreach ($res as $key => $value) {
					$recycleData[$key]['object_id'] = $value['id'];
					$recycleData[$key]['create_time'] = time();
					$recycleData[$key]['table_name'] = 'portal_post';
					$recycleData[$key]['name'] = $value['post_title'];

				}

				Db::startTrans(); //开启事务
				$transStatus = false;
				try {
					Db::name('portal_post')->where(['id' => ['in', $ids]])
						->update([
							'delete_time' => time(),
						]);

					Db::name('recycle_bin')->insertAll($recycleData);

					$transStatus = true;
					// 提交事务
					Db::commit();

				} catch (\Exception $e) {

					// 回滚事务
					Db::rollback();

				}
				return $transStatus;

			} else {
				return false;
			}

		} else {
			return false;
		}
	}

	/**
	 * 后台管理添加页面
	 * @param array $data 页面数据
	 * @return $this
	 */
	public function adminAddPage($data) {
		$data['user_id'] = cmf_get_current_admin_id();

		if (!empty($data['more']['thumbnail'])) {
			$data['more']['thumbnail'] = cmf_asset_relative_url($data['more']['thumbnail']);
		}

		$data['post_status'] = empty($data['post_status']) ? 0 : 1;
		$data['post_type'] = 2;
		$this->allowField(true)->data($data, true)->save();

		return $this;

	}

	/**
	 * 后台管理编辑页面
	 * @param array $data 页面数据
	 * @return $this
	 */
	public function adminEditPage($data) {
		$data['user_id'] = cmf_get_current_admin_id();

		if (!empty($data['more']['thumbnail'])) {
			$data['more']['thumbnail'] = cmf_asset_relative_url($data['more']['thumbnail']);
		}

		$data['post_status'] = empty($data['post_status']) ? 0 : 1;
		$data['post_type'] = 2;
		$this->allowField(true)->isUpdate(true)->data($data, true)->save();

		$routeModel = new RouteModel();
		$routeModel->setRoute($data['post_alias'], 'portal/Page/index', ['id' => $data['id']], 2, 5000);

		$routeModel->getRoutes(true);
		return $this;
	}

}
